﻿using System;
using System.Diagnostics;

using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
using Microsoft.Practices.ObjectBuilder2;

namespace BizElements.BusinessLayer
{
    /// <summary>This type supports the Elements Framework infrastructure and is not intended to be used directly from your code.
    /// Represents the process to build a <see cref="AppLogTableTraceListener"/> described by a <see cref="AppLogTableTraceListenerData"/> configuration object.</summary>
    /// <remarks>This type is linked to the <see cref="AppLogTableTraceListenerData"/> type and it is used by the <see cref="TraceListenerCustomFactory"/> 
    /// to build the specific <see cref="TraceListener"/> object represented by the configuration object.</remarks>
    public sealed class AppLogTableTraceListenerAssembler : TraceListenerAsssembler
    {
        /// <summary>
        /// This method supports the Elements Framework infrastructure and is not intended to be used directly from your code.
        /// Builds a <see cref="AppLogTableTraceListener"/> based on an instance of <see cref="AppLogTableTraceListenerData"/>.
        /// </summary>
        /// <param name="context">The <b>IBuilderContext</b> that represents the current building process.</param>
        /// <param name="objectConfiguration">The configuration object that describes the object to build. Must be an instance of <see cref="AppLogTableTraceListenerData"/>.</param>
        /// <param name="configurationSource">The source for configuration objects.</param>
        /// <param name="reflectionCache">The cache to use retrieving reflection information.</param>
        /// <returns>A fully initialized instance of <see cref="FormattedWebServiceTraceListener"/>.</returns>
        public override TraceListener Assemble(IBuilderContext context, TraceListenerData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
        {
            AppLogTableTraceListenerData castedObjectConfiguration = (AppLogTableTraceListenerData)objectConfiguration;
            ILogFormatter formatter = LogFormatterCustomFactory.Instance.Create(context, castedObjectConfiguration.Formatter, configurationSource, reflectionCache);
            TraceListener createdObject = new AppLogTableTraceListener(formatter);
            return createdObject;
        }
    }
}
